package co.gov.medellin.ssti.sub.common.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Iterator;

import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.AtributosService;
import co.gov.medellin.ssti.sub.model.service.VflexService;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.RepAtributoVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;

/**
 * Clase utility para apoyar la aplicacion de filtros en los reportes.
 * 
 * @author Consultsoft4
 * 
 */
public class FiltrosReportesUtil {
	@Autowired
	AtributosService atributosServiceImpl;
	@Autowired
	public VflexService vflexServiceImpl;

	public void setVflexServiceImpl(VflexService vflexServiceImpl) {
		System.out.println("oi: " + vflexServiceImpl);
		this.vflexServiceImpl = vflexServiceImpl;
	}

	// ------------------------------------------------------------------------
	// Constantes
	// ------------------------------------------------------------------------

	/**
	 * Codigos Filtros reportes.
	 */
	public static final String MAYOR_IGUAL = ">=";
	public static final String MENOR_IGUAL = "<=";
	public static final String IGUAL = "=";
	public static final String DIFERENTE = "<>";
	public static final String MENOR = "<";
	public static final String MAYOR = ">";
	public static final String ENTRE = "BETWEEN";
	public static final String PARECIDO = "LIKE";

	/**
	 * Filtros reportes. Etiquetas o texto del filtro.
	 */
	public static final String MAYOR_IGUAL_E = "[>=] Mayor o Igual";
	public static final String MENOR_IGUAL_E = "[<=] Menor o Igual";
	public static final String IGUAL_E = "[=] Igual a";
	public static final String DIFERENTE_E = "[!=] Diferente a";
	public static final String MENOR_E = "[<] Menor";
	public static final String MAYOR_E = "[>] Mayor";
	public static final String ENTRE_E = "Entre";
	public static final String PARECIDO_E = "Parecido";

	private static final String[] arrayCodFiltros = { MAYOR_IGUAL, MENOR_IGUAL,
			IGUAL, DIFERENTE, MENOR, MAYOR, ENTRE, PARECIDO };

	// Arrays de los distintos tipos de operadores.
	private static final Collection<CondicionConsultaVO> operadores;
	private static final Collection<CondicionConsultaVO> operadoresAlfanumericos;
	private static final Collection<CondicionConsultaVO> operadoresNumericos;
	private static final Collection<CondicionConsultaVO> operadoresFecha;
	// bloque estatico que inicializa los arrays de operadores.
	static {
		operadores = new ArrayList<CondicionConsultaVO>();
		operadoresAlfanumericos = new ArrayList<CondicionConsultaVO>();
		operadoresNumericos = new ArrayList<CondicionConsultaVO>();
		operadoresFecha = new ArrayList<CondicionConsultaVO>();

		CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
		condicionConsultaVO.setFiltro(MAYOR_IGUAL_E);
		condicionConsultaVO.setCodFiltro(MAYOR_IGUAL);
		operadores.add(condicionConsultaVO);
		operadoresNumericos.add(condicionConsultaVO);
		operadoresFecha.add(condicionConsultaVO);

		condicionConsultaVO = new CondicionConsultaVO();
		condicionConsultaVO.setFiltro(MENOR_IGUAL_E);
		condicionConsultaVO.setCodFiltro(MENOR_IGUAL);
		operadores.add(condicionConsultaVO);
		operadoresNumericos.add(condicionConsultaVO);
		operadoresFecha.add(condicionConsultaVO);

		condicionConsultaVO = new CondicionConsultaVO();
		condicionConsultaVO.setFiltro(IGUAL_E);
		condicionConsultaVO.setCodFiltro(IGUAL);
		operadores.add(condicionConsultaVO);
		operadoresAlfanumericos.add(condicionConsultaVO);
		operadoresNumericos.add(condicionConsultaVO);
		operadoresFecha.add(condicionConsultaVO);

		condicionConsultaVO = new CondicionConsultaVO();
		condicionConsultaVO.setFiltro(DIFERENTE_E);
		condicionConsultaVO.setCodFiltro(DIFERENTE);
		operadores.add(condicionConsultaVO);
		operadoresAlfanumericos.add(condicionConsultaVO);
		operadoresNumericos.add(condicionConsultaVO);
		operadoresFecha.add(condicionConsultaVO);

		condicionConsultaVO = new CondicionConsultaVO();
		condicionConsultaVO.setFiltro(MENOR_E);
		condicionConsultaVO.setCodFiltro(MENOR);
		operadores.add(condicionConsultaVO);
		operadoresNumericos.add(condicionConsultaVO);
		operadoresFecha.add(condicionConsultaVO);

		condicionConsultaVO = new CondicionConsultaVO();
		condicionConsultaVO.setFiltro(MAYOR_E);
		condicionConsultaVO.setCodFiltro(MAYOR);
		operadores.add(condicionConsultaVO);
		operadoresNumericos.add(condicionConsultaVO);
		operadoresFecha.add(condicionConsultaVO);

		condicionConsultaVO = new CondicionConsultaVO();
		condicionConsultaVO.setFiltro(ENTRE_E);
		condicionConsultaVO.setCodFiltro(ENTRE);
		operadores.add(condicionConsultaVO);
		operadoresNumericos.add(condicionConsultaVO);
		operadoresFecha.add(condicionConsultaVO);

		condicionConsultaVO = new CondicionConsultaVO();
		condicionConsultaVO.setFiltro(PARECIDO_E);
		condicionConsultaVO.setCodFiltro(PARECIDO);
		operadores.add(condicionConsultaVO);
		operadoresAlfanumericos.add(condicionConsultaVO);
		operadoresNumericos.add(condicionConsultaVO);
	}

	/**
	 * Operaciones realizadas en las paginas para verificar en las Action la
	 * accion realizada por el usuario.
	 */
	public static final String OP_ADD_FILTRO = "ADD_FILTRO";
	public static final String OP_DELETE_FILTRO = "DELETE_FILTRO";
	public static final String OP_SELECT_PROGRAMA = "SELECT_PROGRAMA";
	public static final String OP_SELECT_ATRIBUTO = "SELECT_ATRIBUTO";
	public static final String OP_SELECT_FILTRO = "SELECT_FILTRO";

	/**
	 * Codcampos y etiquetas para grupo familiar.
	 */
	public static final String NAME_GRUPOFAM = "NAME_GRUPOFAM";
	public static final String NAME_GRUPOFAM_E = "NOMBRE GRUPO FAMILIAR";

	public static final String NAME1_BENE = "NAME1_BENE";
	public static final String NAME1_BENE_E = "PRIMER NOMBRE JEFE DE HOGAR";

	public static final String NAME2_BENE = "NAME2_BENE";
	public static final String NAME2_BENE_E = "SEGUNDO NOMBRE JEFE DE HOGAR";

	public static final String APE1_BENE = "APE1_BENE";
	public static final String APE1_BENE_E = "PRIMER APELLIDO JEFE DE HOGAR";

	public static final String APE2_BENE = "APE2_BENE";
	public static final String APE2_BENE_E = "SEGUNDO APELLIDO JEFE DE HOGAR";

	public static final String NUMERO_DOCUMENTO_GF = "NUMERO_DOCUMENTO";
	public static final String NUMERO_DOCUMENTO_GF_E = "No DOCUMENTO JEFE DE HOGAR";

	public static final String NUMERO_BENEFICIOS = "NUMERO_BENEFICIOS";
	public static final String NUMERO_BENEFICIOS_E = "NUMERO DE BENEFICIOS";

	public static final String ORIGEN_A = "A";
	public static final String ORIGEN_N = "N";

	/**
	 * Array de codCampo para grupo familiar.
	 */
	private static final String arrayCodCamposGF[] = { NAME_GRUPOFAM,
			NAME1_BENE, NAME2_BENE, APE1_BENE, APE2_BENE, NUMERO_DOCUMENTO_GF,
			NUMERO_BENEFICIOS };

	/**
	 * Codcampos y etiquetas (esto podria salir de bd, seria mejor)
	 */
	// public static final String
	public static final String BARRIO = "VFL_CODIGO_BARRIO";
	public static final String BARRIO_E = "BARRIO/VEREDA";
	public static final String COMUNA = "VFL_CODIGO_COMUNA";
	public static final String COMUNA_E = "COMUNA/CORREGIMIENTO";
	public static final String CORREO_ELECTRONICO = "CORREO_ELECTRONICO";
	public static final String CORREO_ELECTRONICO_E = "CORREO ELECTRONICO";
	public static final String EDAD = "EDAD";
	public static final String EDAD_E = "EDAD";
	public static final String ETNIA = "ETNIA";
	public static final String ETNIA_E = "ETNIA";
	public static final String FECHA_NACIMIENTO = "FECHA_NACIMIENTO";
	public static final String FECHA_NACIMIENTO_E = "FECHA NACIMIENTO";
	public static final String HECHO_VICTIMIZANTE = "HECHO_VICTIMIZANTE";
	public static final String HECHO_VICTIMIZANTE_E = "HECHO VICTIMIZANTE";
	public static final String NUMERO_DOCUMENTO = "NUMERO_DOCUMENTO";
	public static final String NUMERO_DOCUMENTO_E = "NUMERO DOCUMENTO";
	public static final String PRIMER_APELLIDO = "PRIMER_APELLIDO";
	public static final String PRIMER_APELLIDO_E = "PRIMER APELLIDO";
	public static final String PRIMER_NOMBRE = "PRIMER_NOMBRE";
	public static final String PRIMER_NOMBRE_E = "PRIMER NOMBRE";
	public static final String SEGUNDO_APELLIDO = "SEGUNDO_APELLIDO";
	public static final String SEGUNDO_APELLIDO_E = "SEGUNDO APELLIDO";
	public static final String SEGUNDO_NOMBRE = "SEGUNDO_NOMBRE";
	public static final String SEGUNDO_NOMBRE_E = "SEGUNDO NOMBRE";
	public static final String SEXO = "SEXO";
	public static final String SEXO_E = "SEXO";
	public static final String TELEFONO = "TELEFONO";
	public static final String TELEFONO_E = "TELEFONO";
	public static final String TIPO_DOCUMENTO = "TIPO_DOCUMENTO";
	public static final String TIPO_DOCUMENTO_E = "TIPO DOCUMENTO";
	public static final String ZONA = "VFL_CODIGO_ZONA";
	public static final String ZONA_E = "ZONA";

	// empresa
	public static final String NIT_IDUPA = "NIT_IDUPA";
	public static final String NIT_IDUPA_E = "NIT/IDUPA";
	public static final String NOMBRE_UPA = "NOMBRE_UPA";
	public static final String NOMBRE_UPA_E = "NOMBRE UPA";
	public static final String RAZON_SOCIAL = "RAZON_SOCIAL";
	public static final String RAZON_SOCIAL_E = "RAZON SOCIAL";
	public static final String NOM_REP_LEGAL = "NOM_REP_LEGAL";
	public static final String NOM_REP_LEGAL_E = "NOM REP LEGAL";
	public static final String DOC_REP_LEGAL = "DOC_REP_LEGAL";
	public static final String DOC_REP_LEGAL_E = "DOC REP LEGAL";
	public static final String NOMBRE_CONTACTO = "NOMBRE_CONTACTO";
	public static final String NOMBRE_CONTACTO_E = "NOMBRE CONTACTO";
	public static final String DIRECCION = "DIRECCION";
	public static final String DIRECCION_E = "DIRECCION";
	public static final String SECTOR = "SECTOR";
	public static final String SECTOR_E = "SECTOR";
	public static final String SUBSECTOR = "SUBSECTOR";
	public static final String SUBSECTOR_E = "SUBSECTOR";
	public static final String NUMERO_COMODATO = "NUMERO_COMODATO";
	public static final String NUMERO_COMODATO_E = "NUMERO COMODATO";
	public static final String EMAIL = "EMAIL";
	public static final String EMAIL_E = "EMAIL";
	public static final String OBSERVACIONES = "OBSERVACIONES";
	public static final String OBSERVACIONES_E = "OBSERVACIONES";
	public static final String TIPO_DOCUMENTO_EMPRESA = "TIPO_DOCUMENTO_EMPRESA";
	public static final String TIPO_DOCUMENTO_EMPRESA_E = "TIPO DOCUMENTO";

	// sisben
	public static final String DISCAPACIDAD_SISBEN = "DISCAPACIDAD_SISBEN";
	public static final String DISCAPACIDAD_SISBEN_E = "DISCAPACIDAD SISBEN";
	public static final String HOGAR_SISBEN = "HOGAR_SISBEN";
	public static final String HOGAR_SISBEN_E = "HOGAR SISBEN";
	public static final String FECHA_ENCUESTA_SISBEN = "FECHA_ENCUESTA_SISBEN";
	public static final String FECHA_ENCUESTA_SISBEN_E = "FECHA ENCUESTA SISBEN";
	public static final String FICHA_SISBEN = "FICHA_SISBEN";
	public static final String FICHA_SISBEN_E = "FICHA SISBEN";
	public static final String NIVEL_SISBEN = "NIVEL_SISBEN";
	public static final String NIVEL_SISBEN_E = "NIVEL SISBEN";
	public static final String ORDEN_SISBEN = "ORDEN_SISBEN";
	public static final String ORDEN_SISBEN_E = "ORDEN SISBEN";
	public static final String PUNTAJE_SISBEN = "PUNTAJE_SISBEN";
	public static final String PUNTAJE_SISBEN_E = "PUNTAJE SISBEN";

	// Tipos de campos: alfanumerico, fecha, numerico.
	public static final String TIPO_CAMPO_ALFANUMERICO = "A";
	public static final String TIPO_CAMPO_FECHA = "F";
	public static final String TIPO_CAMPO_NUMERICO = "N";
	private static final Collection<String> tipoCampos;
	static {
		tipoCampos = new ArrayList<String>();
		tipoCampos.add(TIPO_CAMPO_ALFANUMERICO);
		tipoCampos.add(TIPO_CAMPO_NUMERICO);
		tipoCampos.add(TIPO_CAMPO_FECHA);
	}

	/**
	 * Map de codCampos. Para las listas desplegables de atributos para los
	 * filtros de los reportes. Esto deberia salir de bd..
	 */
	public static final Collection<RepAtributoVO> codCampos;
	public static final Collection<RepAtributoVO> codCamposEmpresa;
	static {
		codCampos = new ArrayList<RepAtributoVO>();
		codCamposEmpresa = new ArrayList<RepAtributoVO>();
		RepAtributoVO repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(BARRIO);
		repAtributoVO.setEtiqueta(BARRIO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(COMUNA);
		repAtributoVO.setEtiqueta(COMUNA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(CORREO_ELECTRONICO);
		repAtributoVO.setEtiqueta(CORREO_ELECTRONICO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(DIRECCION);
		repAtributoVO.setEtiqueta(DIRECCION_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(DOC_REP_LEGAL);
		repAtributoVO.setEtiqueta(DOC_REP_LEGAL_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(EDAD);
		repAtributoVO.setEtiqueta(EDAD_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_NUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(EMAIL);
		repAtributoVO.setEtiqueta(EMAIL_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(ETNIA);
		repAtributoVO.setEtiqueta(ETNIA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(FECHA_NACIMIENTO);
		repAtributoVO.setEtiqueta(FECHA_NACIMIENTO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_FECHA);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(HECHO_VICTIMIZANTE);
		repAtributoVO.setEtiqueta(HECHO_VICTIMIZANTE_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_NUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NIT_IDUPA);
		repAtributoVO.setEtiqueta(NIT_IDUPA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NOMBRE_CONTACTO);
		repAtributoVO.setEtiqueta(NOMBRE_CONTACTO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NOMBRE_UPA);
		repAtributoVO.setEtiqueta(NOMBRE_UPA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NOM_REP_LEGAL);
		repAtributoVO.setEtiqueta(NOM_REP_LEGAL_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NUMERO_COMODATO);
		repAtributoVO.setEtiqueta(NUMERO_COMODATO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NUMERO_DOCUMENTO);
		repAtributoVO.setEtiqueta(NUMERO_DOCUMENTO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(PRIMER_APELLIDO);
		repAtributoVO.setEtiqueta(PRIMER_APELLIDO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(PRIMER_NOMBRE);
		repAtributoVO.setEtiqueta(PRIMER_NOMBRE_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(RAZON_SOCIAL);
		repAtributoVO.setEtiqueta(RAZON_SOCIAL_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(SEGUNDO_APELLIDO);
		repAtributoVO.setEtiqueta(SEGUNDO_APELLIDO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(SEGUNDO_NOMBRE);
		repAtributoVO.setEtiqueta(SEGUNDO_NOMBRE_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(SEXO);
		repAtributoVO.setEtiqueta(SEXO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(TELEFONO);
		repAtributoVO.setEtiqueta(TELEFONO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(TIPO_DOCUMENTO);
		repAtributoVO.setEtiqueta(TIPO_DOCUMENTO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(TIPO_DOCUMENTO_EMPRESA);
		repAtributoVO.setEtiqueta(TIPO_DOCUMENTO_EMPRESA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(ZONA);
		repAtributoVO.setEtiqueta(ZONA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(DISCAPACIDAD_SISBEN);
		repAtributoVO.setEtiqueta(DISCAPACIDAD_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(HOGAR_SISBEN);
		repAtributoVO.setEtiqueta(HOGAR_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(FECHA_ENCUESTA_SISBEN);
		repAtributoVO.setEtiqueta(FECHA_ENCUESTA_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_FECHA);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(FICHA_SISBEN);
		repAtributoVO.setEtiqueta(FICHA_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NIVEL_SISBEN);
		repAtributoVO.setEtiqueta(NIVEL_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_NUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(OBSERVACIONES);
		repAtributoVO.setEtiqueta(OBSERVACIONES_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(ORDEN_SISBEN);
		repAtributoVO.setEtiqueta(ORDEN_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(PUNTAJE_SISBEN);
		repAtributoVO.setEtiqueta(PUNTAJE_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_NUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(SECTOR);
		repAtributoVO.setEtiqueta(SECTOR_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(SUBSECTOR);
		repAtributoVO.setEtiqueta(SUBSECTOR_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCamposEmpresa.add(repAtributoVO);
	}

	/**
	 * tipodato de los atributos.
	 */
	public static final String TIPO_ALFANUMERICO = "A";
	public static final String TIPO_NUMERICO = "N";
	public static final String TIPO_FECHA = "F";

	/**
	 * Retorna un map. key: nombre del campo, value: CondicionConsultaUtilVO
	 * 
	 * @param codCampo
	 * @return
	 */
	public synchronized CondicionConsultaUtilVO obtainCondicionConsulta(
			String codCampo) {
		CondicionConsultaUtilVO condicionConsultaUtilVO = null;
		if (isCodCampoValido(codCampo)) {
			String tipo = findTipoCampo(codCampo);
			Collection<CondicionConsultaVO> operadores = doFindOperadoresDelTipo(tipo);
			Collection<CondicionConsultaVO> valores1 = doFindValores1(codCampo);
			condicionConsultaUtilVO = new CondicionConsultaUtilVO(operadores,
					valores1, tipo);
		}
		return condicionConsultaUtilVO;
	}

	/**
	 * 
	 * @param codCampo
	 * @return
	 */
	public static synchronized boolean isCodCampoGFValido(String codCampo) {
		for (int i = 0; i < arrayCodCamposGF.length; i++) {
			if (arrayCodCamposGF[i].equals(codCampo)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 
	 * @param codFiltro
	 * @return
	 */
	public static synchronized boolean isCodFiltroValido(String codFiltro) {
		for (int i = 0; i < arrayCodFiltros.length; i++) {
			if (arrayCodFiltros[i].equals(codFiltro)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Metodo para validar si un campo, para los filtros de los reportes, es
	 * valido.
	 * 
	 * @param codCampo
	 *            Nombre del campo.
	 * @return true si el campo es valido.
	 */
	public static synchronized boolean isCodCampoValido(String codCampo) {
		Iterator<RepAtributoVO> it = codCampos.iterator();
		while (it.hasNext()) {
			RepAtributoVO repAtributoVO = (RepAtributoVO) it.next();
			if (repAtributoVO.getNombre().equalsIgnoreCase(codCampo)) {
				return true;
			}
		}

		// si no ha retornado, buscar en empresa
		it = codCamposEmpresa.iterator();
		while (it.hasNext()) {
			RepAtributoVO repAtributoVO = (RepAtributoVO) it.next();
			if (repAtributoVO.getNombre().equalsIgnoreCase(codCampo)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Metodo que retorna un String representando la fecha de nacimiento
	 * correspondiente a una edad.
	 * 
	 * @param age
	 *            edad.
	 * @return String representando la fecha de nacimiento, en formato
	 *         dd/MM/yyyy.
	 */
	public static String convertAgeToDateOfBirth(int age) {
		age = Math.abs(age);
		Calendar calendar = Calendar.getInstance();
		// se resta la edad para obtener la fecha de nacimiento.
		calendar.add(Calendar.YEAR, -age);
		DateFormat formatter = new SimpleDateFormat(Utility.DATE_FORMAT);
		System.out.println(formatter.format(calendar.getTime()));
		return formatter.format(calendar.getTime());
	}

	/**
	 * 
	 * @param codCampo
	 * @return
	 */
	private synchronized Collection<CondicionConsultaVO> doFindValores1(
			String codCampo) {
		// Collection de CondicionConsultaVO
		Collection<CondicionConsultaVO> valores1 = new ArrayList<CondicionConsultaVO>();
		if (isCodCampoValido(codCampo)) {
			// Si es tipo_documento
			if (codCampo.equalsIgnoreCase(TIPO_DOCUMENTO)) {
				String Arrlista[] = { "CEDULA CIUDADANIA",
						"CEDULA EXTRANJERIA", "NIT", "PASAPORTE",
						"REGISTRO CIVIL", "TARJETA IDENTIDAD", "NIP", "NUIP",
						"NISE", "CABILDO", "OTRO" };
				String Arrlista2[] = { "C", "E", "N", "P", "R", "T", "I", "U",
						"S", "A", "0" };
				for (int i = 0; i < Arrlista.length; i++) {
					CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
					condicionConsultaVO.setFiltro(Arrlista[i]);
					condicionConsultaVO.setCodFiltro(Arrlista2[i]);
					valores1.add(condicionConsultaVO);
				}
			}// Si es tipo_documento empresa
			else if (codCampo.equalsIgnoreCase(TIPO_DOCUMENTO_EMPRESA)) {
				String Arrlista[] = { "NIT", "IDUPA" };
				String Arrlista2[] = { "N", "I" };
				for (int i = 0; i < Arrlista.length; i++) {
					CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
					condicionConsultaVO.setFiltro(Arrlista[i]);
					condicionConsultaVO.setCodFiltro(Arrlista2[i]);
					valores1.add(condicionConsultaVO);
				}
			} else if (codCampo.equalsIgnoreCase(SEXO)) {
				String Arrlista[] = { "MASCULINO", "FEMENINO" };
				String Arrlista2[] = { "M", "F" };
				for (int i = 0; i < Arrlista.length; i++) {
					CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
					condicionConsultaVO.setFiltro(Arrlista[i]);
					condicionConsultaVO.setCodFiltro(Arrlista2[i]);
					valores1.add(condicionConsultaVO);
				}
			} else if (codCampo.equalsIgnoreCase(COMUNA)
					|| codCampo.equalsIgnoreCase(ZONA)
					|| codCampo.equalsIgnoreCase(BARRIO)) {
				try {
					String parameter = "";
					if (codCampo.equalsIgnoreCase(COMUNA)) {
						parameter = "COMUNA";
					} else if (codCampo.equalsIgnoreCase(ZONA)) {
						parameter = "ZONA";
					} else {
						parameter = "BARRIO";
					}

					Collection<VflexVO> vFlexVOL = vflexServiceImpl
							.findVflex(parameter);
					Iterator<VflexVO> it = vFlexVOL.iterator();
					while (it.hasNext()) {
						VflexVO vo = (VflexVO) it.next();
						CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
						condicionConsultaVO.setFiltro(vo.getDescVflex());
						condicionConsultaVO.setCodFiltro(Long.toString(vo
								.getCode().longValue()));
						valores1.add(condicionConsultaVO);
					}
				} catch (DAOException e) {
					throw e;
				}
			} else if (codCampo.equalsIgnoreCase(HECHO_VICTIMIZANTE)) {
				try {
					String strCodeAtri = atributosServiceImpl
							.findTTVFCodeAtributoGenerico(AtributosService.HECHO_VICTIMIZANTE);
					Collection<VflexVO> col = vflexServiceImpl
							.findByTVFCodigo(strCodeAtri);
					Iterator<VflexVO> it = col.iterator();
					while (it.hasNext()) {
						VflexVO vo = it.next();
						CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
						condicionConsultaVO.setFiltro(vo.getDescVflex());
						condicionConsultaVO.setCodFiltro(vo.getNombreVflex());
						valores1.add(condicionConsultaVO);
					}
				} catch (DAOException e) {
					throw e;
				}
			} else if (codCampo.equalsIgnoreCase(ETNIA)) {
				String Arrlista[] = { "AFROCOLOMBIANO", "INDIGENA", "OTRA" };
				String Arrlista2[] = { "A", "I", "O" };
				for (int i = 0; i < Arrlista.length; i++) {
					CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
					condicionConsultaVO.setFiltro(Arrlista[i]);
					condicionConsultaVO.setCodFiltro(Arrlista2[i]);
					valores1.add(condicionConsultaVO);
				}

			} else if (codCampo.equalsIgnoreCase(DISCAPACIDAD_SISBEN)) {
				String Arrlista[] = { "SI", "NO" };
				String Arrlista2[] = { "SI", "NO" };
				for (int i = 0; i < Arrlista.length; i++) {
					CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
					condicionConsultaVO.setFiltro(Arrlista[i]);
					condicionConsultaVO.setCodFiltro(Arrlista2[i]);
					valores1.add(condicionConsultaVO);
				}

			}
		}
		return valores1;
	}

	/**
	 * Metodo provisional, hack, machete que indica si un atributo es del tipo
	 * indicado.
	 * 
	 * @param codCampo
	 *            nombre del campo.
	 * @param tipo
	 *            Tipo de valor (alfanumerico, numerico, fecha,
	 * @return
	 */
	/*
	 * private static boolean isCodCampoDelTipo(String codCampo, String tipo) {
	 * Iterator it = codCampos.iterator(); while (it.hasNext()) { RepAtributoVO
	 * repAtributoVO = (RepAtributoVO) it.next(); if
	 * (repAtributoVO.getNombre().equalsIgnoreCase(codCampo)) { if
	 * (repAtributoVO.getTipoCampo().equalsIgnoreCase(tipo)) { return true; }
	 * break; } } return false; }
	 */

	/**
	 * TODO: throw exception? Metodo que retorna el tipo de campo.
	 * 
	 * @param codCampo
	 *            Codigo del campo.
	 * @return tipo del campo, o null si no se encuentra.
	 */
	private synchronized String findTipoCampo(String codCampo) {
		Iterator<RepAtributoVO> it = codCampos.iterator();
		while (it.hasNext()) {
			RepAtributoVO repAtributoVO = (RepAtributoVO) it.next();
			if (repAtributoVO.getNombre().equalsIgnoreCase(codCampo)) {
				return repAtributoVO.getTipoCampo();
			}
		}

		// si no ha retornado, buscar en los de empresa
		it = codCamposEmpresa.iterator();
		while (it.hasNext()) {
			RepAtributoVO repAtributoVO = (RepAtributoVO) it.next();
			if (repAtributoVO.getNombre().equalsIgnoreCase(codCampo)) {
				return repAtributoVO.getTipoCampo();
			}
		}
		return null;
	}

	/**
	 * Metodo que verifica si el tipo de operador es valido.
	 * 
	 * @param tipo
	 *            Tipo de operador.
	 * @return true si es valido, false en caso contrario.
	 */
	private synchronized boolean isValidTipo(String tipo) {
		Iterator<String> it = tipoCampos.iterator();
		while (it.hasNext()) {
			String tipoValido = (String) it.next();
			if (tipoValido.equalsIgnoreCase(tipo)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Metodo que retorna una coleccion de operadores correspondientes a un tipo
	 * de operador.
	 * 
	 * @param tipo
	 *            Tipo de operador ("A", "N", "F").
	 * @return Collection<CondicionConsultaVO> operadores correspondientes al
	 *         tipo.
	 */
	private synchronized Collection<CondicionConsultaVO> doFindOperadoresDelTipo(
			String tipo) {
		if (isValidTipo(tipo)) {
			if (tipo.equalsIgnoreCase(TIPO_CAMPO_ALFANUMERICO)) {
				return operadoresAlfanumericos;
			} else if (tipo.equalsIgnoreCase(TIPO_CAMPO_NUMERICO)) {
				return operadoresNumericos;
			} else {// fecha
				return operadoresFecha;
			}
		}
		return null;
	}

}
